/*  Classe:QMODELDATAREPORT
     Ecrit par: S Pitault
     Date: déc 2010- janv 2011
     Licence: LGPL V2
     Role: Imprimer un QAbstractTableModel sous forme d'un listing tableau
     Les titres, en tètes , tailles de polices, largeur de colonnes, etc... sont paramètrables
     et accessibles par des méthodes.
  */

#ifndef QMODELDATAREPORT_H
#define QMODELDATAREPORT_H

#include <QObject>
#include <QAbstractTableModel>
#include <QItemSelectionModel>
#include <QMessageBox>
#include <QPrintDialog>
#include <QPrinter>
#include <QSqlQuery>
#include <QPainter>
#include <QDate>
#include <QTime>


class QModelDataReport : public QObject
{
    Q_OBJECT

public:
    // type de variable personnalisées
    enum dataType {
        typeIsQString, // donnée de type QString
        typeIsInteger, // donnée de type int en base 10
        typeIsHexa, // donnée de type int en hexa
        typeIsCurrency, // données de type monétaire (décimal formaté en +/- 9999.99)
        typeIsDouble, //donnée de type décimal affichée +/- 9999.999
        typeIsDoubleSciences, // donnée de type décimal affichée +/- 9.999 E+/-999
        typeIsQDate,// donnée de type QDate
        typeIsQTime, // donnée de type QTime
        typeIsQDateTime // donnée de type QDateTime
    };

    struct dataFormat {
        QString strFormat; // chaine de format contenant %1
        dataType typeFormat; // type de la données à convertir de QVariant en dataType
        int fieldwidthFormat; // nombre de caractères ou chiffres à afficher
        QString fillFormat; // type de caractère de complément ou format date pour typeIsDate
    };

    // constructeurs

    explicit QModelDataReport(QAbstractTableModel *model,QObject *parent = 0);
    // gestion du model et des colonnes du body
     void setListofColumns(QList<int> *columns);
     void setBodyFont(QFont font);
     void setColumnWidthPercentage(QList<int> *widthpercent);
     void setCellsPadding(int padding);
     void setCellsAlignment(QList<int> *alignment);
     void setCellsDataFormat(QList<dataFormat> *format);
     void getDefaultDataFormat(dataFormat *dformat);
     void setAfficheZero(bool a);
     void setSelectionModel(QItemSelectionModel *m);

    // gestion du header de colonnes
    void setListofColumnsHeader(QStringList *header);
     void setHeadersFont(QFont font);
     // gestion du titre de rapport 2/3 de pages (plusieurs lignes possibles)
     void setTitleText(QString text);
     void setTitleHeight(int height);
     void setTitleFont(QFont font);
     // gestion de l'entete de rapport largeur de page (plusieurs lignes possibles)
     void setHeaderReportText(QString text);
     void setHeaderReportHeight(int height);
     void setHeaderReportFont(QFont font);
     // gestion de l'entete de page en 3 parties (gauche centre droit) sur une seule ligne
     void setHeaderPageLeftText(QString text);
     void setHeaderPageCenterText(QString text);
     void setHeaderPageRightText(QString text);
     void setHeaderPageFont(QFont font);
     // gestion du pied de page en 2 parties (gauche  droit) sur une seule ligne (le centre est réservé au numéro de page)
     void setFooterPageLeftText(QString text);
     void setFooterPageRightText(QString text);
     void setFooterPageFont(QFont font);
     // gestion du bilan fin de rapport sur la largeur de page et plusieurs lignes possibles
     void setEndReportText(QString text);
     void setEndReportHeight(int height);
     void setEndReportFont(QFont font);
     // calcul des totaux
     void getSumOfnumColumns(QList<QVariant> *Sum);
     // gestion de l'impression et contruction du rapport
     void model_print();
     void setOutputFormat(QPrinter::OutputFormat support);

signals:

public slots:

private:
     // initialisation des proprietes par constructeur
    void init_parameters();
    // construction du rapport par model_print()
    bool parameters_test();
    void width_conversion();
    void draw_title();
    void draw_report_header();
    void draw_page_header();
    void draw_headers();
    void draw_body();
    void draw_page_footer();
    void draw_report_footer();
    void next_line();
    // proprietes de la classe par type


    QAbstractTableModel *sqlmodel;
    QItemSelectionModel *selectionModel;

    QPainter painter;
    QPrinter printer;
    QPrinter::OutputFormat print_support;
    QList<int> *columnsnumber;
    QList<int> *columnswidthpercentage;
    QList<int> columnswidthpixel;

    QList<int> *columnAlignment;
    QStringList *columnsheader;
    QList<dataFormat> *columnsDataFormat;
    QList<int> defaultlistcolumn;
    QList<int> defaultlistwidth;
    QList<int> defaultlistaligment;
    QStringList defaultlistheader;
    QList<dataFormat> defaultlistformat;

    QString title_Text;
    QString header_Report_Text;
    QString header_Page_LeftText;
    QString header_Page_CenterText;
    QString header_Page_RightText;
    QString footer_Page_LeftText;
    QString footer_Page_RightText;
    QString footer_Report_Text;
    QFont title_Font;
    QFont header_Report_Font;
    QFont header_Page_Font;
    QFont headers_Font;
    QFont footer_Page_Font;
    QFont footer_Report_Font;
    QFont body_Font;
    //dataFormat *defaultdataformat;
    dataFormat defaultFormat;
    int title_Height;
    int page_Height;
    int page_Width;
    int header_Height;
    int header_Report_Height;
    int body_top;
    int header_Page_Height;
    int footer_Page_Height;
    int footer_Report_Height;
    int body_Height;
    int line_Height;
    int Number_of_lines;
    int line_Num;
    int page_Num;
    int cell_Padding;

    bool afficheZero;

};

#endif // QMODELDATAREPORT_H
